/**
 * 
 */
package uy.com.pzit.fpmundialmodel.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;

import uy.com.pzit.core.generator.RandomListNumberGenerator;
import uy.com.pzit.fpmundialmodel.domain.Confederacion;
import uy.com.pzit.fpmundialmodel.domain.ConfederationsNames;
import uy.com.pzit.fpmundialmodel.domain.Eliminatoria;
import uy.com.pzit.fpmundialmodel.domain.Mundial;
import uy.com.pzit.fpmundialmodel.domain.Pais;
import uy.com.pzit.fpmundialmodel.domain.PaisEnCompeticion;
import uy.com.pzit.fpmundialmodel.generator.EliminatoriaGenerator;
import uy.com.pzit.fpmundialmodel.manager.ConfederacionManager;
import uy.com.pzit.fpmundialmodel.manager.MundialManager;
import uy.com.pzit.fpmundialmodel.manager.PaisManager;
import uy.com.pzit.fpmundialmodel.response.MessageManager;
import uy.com.pzit.fpmundialmodel.response.MundialResponse;
import uy.com.pzit.fpmundialmodel.web.ModelContextServlet;
import uy.com.pzit.fpmundialmodel.web.ws.MundialService;

/**
 * @author pferraz
 * 
 */
public class MundialServiceImpl implements MundialService {
	private static final int CANTIDAD_PAISES=90;
	private MundialManager mundialManager;
	private ConfederacionManager confederacionManager;
	private PaisManager paisManager;
	
	private MundialManager getManager() {
		if (this.mundialManager == null)
			this.mundialManager = (MundialManager) ModelContextServlet
					.getSpringContext().getBean("mundialManager");
		return this.mundialManager;
	}

	@Override
	public MundialResponse newMundial() {
		MundialResponse mundResp = new MundialResponse();
		if(!getManager().checkMundialEnCurso()){
			List<Eliminatoria> eliminatorias = new ArrayList<Eliminatoria>();
			Mundial mundial = new Mundial();
			final Pais locatario = elegirLocatario();
			createEliminatorias(eliminatorias,locatario);
			mundial.setEliminatorias(new HashSet<Eliminatoria>(eliminatorias));
			mundial.setLocalidad(locatario);
			mundial.setFechaInicio(new Date());
			getManager().newMundial(mundial);
			mundResp.setSuccess(true);
			mundResp.setMundial(mundial);
		}else{
			mundResp.setSuccess(false);
			mundResp.setMessage(MessageManager.getInstance().getMessage("worldCup.active"));
		}
		return mundResp;
	}

	private Pais elegirLocatario() {
		RandomListNumberGenerator random=new RandomListNumberGenerator(CANTIDAD_PAISES);
		return getPaisManager().getPaisById(random.next()).getPaises().get(0);
	}

	private void createEliminatorias(List<Eliminatoria> eliminatorias, Pais locatario) {
		List<Eliminatoria> uefaElims = EliminatoriaGenerator.getUEFARandom(getConfederacionManager().getConfedearacionByName(ConfederationsNames.UEFA).getConfederaciones().get(0),locatario);

		Confederacion c_conmebol = getConfederacionManager().getConfedearacionByName(ConfederationsNames.CONMEBOL).getConfederaciones().get(0);
		Eliminatoria conmebol = new Eliminatoria(c_conmebol, 0,	c_conmebol.getCupos());
		
		Confederacion c_concacaf = getConfederacionManager().getConfedearacionByName(ConfederationsNames.CONCACAF).getConfederaciones().get(0);
		Eliminatoria concacaf = new Eliminatoria(c_concacaf, 0,	c_concacaf.getCupos());
		
		Confederacion c_caf = getConfederacionManager().getConfedearacionByName(ConfederationsNames.CAF).getConfederaciones().get(0);
		Eliminatoria caf = new Eliminatoria(c_caf, 0, c_caf.getCupos());
		
		Confederacion c_afc = getConfederacionManager().getConfedearacionByName(ConfederationsNames.AFC).getConfederaciones().get(0);
		Eliminatoria afc = new Eliminatoria(c_afc, 0, c_afc.getCupos());
		
		Confederacion c_ofc = getConfederacionManager().getConfedearacionByName(ConfederationsNames.OFC).getConfederaciones().get(0);
		Eliminatoria ofc = new Eliminatoria(c_ofc, 0, c_ofc.getCupos());
		
		Eliminatoria uefa1 = uefaElims.get(0);
		Eliminatoria uefa2 = uefaElims.get(1);
		Eliminatoria uefa3 = uefaElims.get(2);
		Eliminatoria uefa4 = uefaElims.get(3);

		eliminatorias.add(conmebol);
		eliminatorias.add(concacaf);
		eliminatorias.add(caf);
		eliminatorias.add(afc);
		eliminatorias.add(ofc);
		for (Eliminatoria e : eliminatorias) {
			e.setPaises(new HashSet<PaisEnCompeticion>());
			for (Pais p : e.getConfederacion().getPaises()) {
				if(!p.getNombre().equalsIgnoreCase(locatario.getNombre()))
					e.getPaises().add(new PaisEnCompeticion(p));
			}
		}
		/* La UEFA YA TIENE LOS PAISES EN COMPETICION */
		eliminatorias.add(uefa1);
		eliminatorias.add(uefa2);
		eliminatorias.add(uefa3);
		eliminatorias.add(uefa4);

	}

	private PaisManager getPaisManager() {
		if(this.paisManager==null)
			this.paisManager=(PaisManager)ModelContextServlet.getSpringContext().getBean("paisManager");
		return this.paisManager;
	}
	
	private ConfederacionManager getConfederacionManager() {
		if (this.confederacionManager == null)
			this.confederacionManager = (ConfederacionManager) ModelContextServlet.getSpringContext().getBean("confederacionManager");
		return this.confederacionManager;
	}

	
	
	@Override
	public MundialResponse updateMundial(Mundial mundial) {
		Mundial m=getManager().updateMundial(mundial);
		MundialResponse mResp=new MundialResponse();
		if(m!=null){
			mResp.setSuccess(true);
			mResp.setMundial(m);
		}
		return mResp;
	}

	@Override
	public MundialResponse getLastMundial() {
		return getManager().getMundialEnCurso();
	}
}
